home *** CD-ROM | disk | FTP | other *** search
/ Aminet 22 / Aminet 22 (1997)(GTI - Schatztruhe)[!][Dec 1997].iso / Aminet / util / pack / RealSize.lha / RealSize / RealSize.e < prev    next >
Text File  |  1997-08-28  |  3KB  |  110 lines

  1. /* RealSize v1.0 by Kyzer/CSG */
  2.  
  3. OPT OSVERSION=34
  4.  
  5. MODULE 'exec/memory', 'exec/libraries', 'xfdmaster', 'libraries/xfdmaster'
  6.  
  7. ENUM FILE=0,NOEXTERN,WIDTH,NOLINE
  8.  
  9. DEF ret=20,err=0
  10.  
  11. PROC main()
  12.   DEF args:PTR TO LONG,rdargs=0,mem,len,reallen,fh,bi,cmd[200]:STRING,
  13.   varname, filename=0
  14.  
  15.   xfdmasterbase:=OpenLibrary('xfdmaster.library',37)
  16.  
  17.   args:=[0,0,0,0];
  18.   IF KickVersion(36)
  19.     IF rdargs:=ReadArgs('FILE/A,NE=NOEXTERN/S,WIDTH/N,NOLINE/S',args,NIL)
  20.       filename:=args[FILE]
  21.     ENDIF
  22.   ELSE
  23.     filename:=arg
  24.   ENDIF
  25.   IF filename
  26.     IF (len:=FileLength(filename))>0
  27.       reallen:=len
  28.       ret:=5
  29.       IF mem:=AllocMem(len,MEMF_PUBLIC)
  30.  
  31.         IF fh:=Open(filename,OLDFILE)
  32.           IF (reallen:=Read(fh,mem,len))<>-1
  33.             Close(fh)
  34.             IF xfdmasterbase
  35.               IF bi:=XfdAllocObject(XFDOBJ_BUFFERINFO)
  36.                 reallen:=decr(bi,args[NOEXTERN],mem,reallen)
  37.                 XfdFreeObject(bi)
  38.               ELSE
  39.                 err:='can\at allocate XFD buffer'
  40.               ENDIF
  41.             ELSE
  42.               err:='can\at open xfdmaster.library'
  43.             ENDIF
  44.           ELSE
  45.             err:='read error'
  46.           ENDIF
  47.         ELSE
  48.           err:='can\at open file'
  49.         ENDIF
  50.  
  51.         FreeMem(mem,len)
  52.       ELSE
  53.         err:='out of memory'
  54.       ENDIF
  55.       IF args[WIDTH]
  56.         StringF(cmd,'%\dld',Long(args[WIDTH]))
  57.       ELSE
  58.         StringF(cmd,'%ld')
  59.       ENDIF
  60.       WriteF(cmd,reallen)
  61.       IF args[NOLINE]=FALSE THEN WriteF('\n')
  62.     ELSE
  63.       err:='can\at examine file'
  64.     ENDIF
  65.     IF rdargs THEN FreeArgs(rdargs)
  66.   ELSE
  67.     err:='bad args'
  68.   ENDIF
  69.  
  70.   IF xfdmasterbase THEN CloseLibrary(xfdmasterbase)
  71.  
  72.   varname:='RealSizeError'
  73.   IF err
  74.     IF KickVersion(36)
  75.       SetVar(varname,err,-1,0)
  76.     ELSE
  77.       /* 1.3 compatible method */
  78.       StringF(cmd,'set \s "\s"',varname,err)
  79.       Execute(cmd,0,0)
  80.     ENDIF
  81.   ENDIF
  82. ENDPROC ret
  83.  
  84. PROC decr(bufinf:PTR TO xfdbufferinfo,noextern,mem,len)
  85.   bufinf.sourcebuffer:=mem
  86.   bufinf.sourcebuflen:=len
  87.   bufinf.flags:=IF noextern THEN 0 ELSE XFDFB_RECOGEXTERN
  88.   IF XfdRecogBuffer(bufinf)
  89.     IF 0=(bufinf.packerflags AND (XFDPFF_PASSWORD OR XFDPFF_KEY16 OR XFDPFF_KEY32))
  90.       IF bufinf.packerflags AND XFDPFF_RECOGLEN
  91.         ret:=0
  92.         RETURN bufinf.finaltargetlen
  93.       ELSE
  94.         bufinf.targetbufmemtype:=MEMF_PUBLIC
  95.         IF XfdDecrunchBuffer(bufinf)
  96.           FreeMem(bufinf.targetbuffer,bufinf.targetbuflen)
  97.           ret:=0
  98.           RETURN bufinf.targetbufsavelen
  99.         ELSE
  100.           err:='couldn\at decrunch file'
  101.         ENDIF
  102.       ENDIF
  103.     ELSE
  104.       err:='file needs password or key'
  105.     ENDIF
  106.   ELSE
  107.     err:='not crunched/unknown cruncher'
  108.   ENDIF
  109. ENDPROC len
  110.